home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 #1 / Ham Radio 2000.iso / ham2000 / packet / p_aa4re / bb212src / bbcmf.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1992-02-16  |  10.8 KB  |  330 lines

  1. (*===========================================================================*)
  2. (* Change msg flag command                                                   *)
  3. (*                                                                           *)
  4. (*   Copyright 1991 by H. Roy Engehausen.  All rights reserved.              *)
  5. (*                                                                           *)
  6. (*===========================================================================*)
  7.  
  8. {$O+}
  9.  
  10. UNIT BBCMF;
  11.  
  12. INTERFACE
  13.  
  14. USES
  15.   bbdummy;
  16.  
  17. PROCEDURE change_status_cmd(cmd_string : STRING);
  18.  
  19. CONST
  20.   change_status_list : STRING[15] = 'HOLD REL UNKILL';
  21.  
  22. IMPLEMENTATION
  23.  
  24. USES
  25.   CRT,
  26.   bblog,
  27.   bbmdata,
  28.   bbmess,
  29.   bbmisc,
  30.   bbmf,
  31.   bbmmsgn,
  32.   bbsearch,
  33.   bbstr;
  34.  
  35. {$UNDEF debug}
  36.  
  37. (*===========================================================================*)
  38. (* Change a specific message                                                 *)
  39. (*===========================================================================*)
  40.  
  41. PROCEDURE change_a_msg(m_ptr : msg_index_ptr;
  42.                        and_mask : msg_flag_type;
  43.                        or_mask  : msg_flag_type;
  44.                        tell_sw  : BOOLEAN);
  45.   BEGIN;
  46.  
  47.     WITH m_ptr^.msg_i_mb DO
  48.       BEGIN;
  49.  
  50.         (*-------------------------------------------------------------------*)
  51.         (* Set flag and update the message file                              *)
  52.         (*-------------------------------------------------------------------*)
  53.  
  54.         msg_flag := (msg_flag AND and_mask) OR or_mask;
  55.  
  56.         update_msg(m_ptr);
  57.  
  58.         (*-------------------------------------------------------------------*)
  59.         (* Tell user if he wants to know about it                            *)
  60.         (*-------------------------------------------------------------------*)
  61.  
  62.         IF NOT tell_sw THEN
  63.           EXIT;
  64.  
  65.         active_tcb^.curr_msg := m_ptr^;
  66.  
  67.         send_message(message_flag_change);
  68.  
  69.         (*-------------------------------------------------------------------*)
  70.         (* Update routing pointer as needed                                  *)
  71.         (*-------------------------------------------------------------------*)
  72.  
  73.         IF msg_route_num > msg_number THEN
  74.           msg_route_num := msg_number;
  75.  
  76.       END;
  77.  
  78.   END;
  79.  
  80. (*===========================================================================*)
  81. (* Change a group of messages                                                *)
  82. (*===========================================================================*)
  83.  
  84. PROCEDURE change_msg_group(VAR cmd_string : STRING;
  85.                                  and_mask : msg_flag_type;
  86.                                  or_mask  : msg_flag_type);
  87.  
  88.   VAR
  89.     b            : BOOLEAN;
  90.     i_ptr        : msg_index_ptr;
  91.     search_block : search_block_type;
  92.     change_char  : CHAR;
  93.     c_msg_no     : LONGINT;
  94.     ok_to_change : BOOLEAN;
  95.     word_count   : BYTE;
  96.  
  97.   (*=========================================================================*)
  98.   (* Put change error message out                                            *)
  99.   (*=========================================================================*)
  100.  
  101.   PROCEDURE put_change_error(err_num : BYTE);
  102.  
  103.     VAR
  104.       err_string : STRING[6];
  105.  
  106.     BEGIN;
  107.  
  108.       WITH active_tcb^ DO
  109.         BEGIN;
  110.  
  111.           STR(c_msg_no, err_string);
  112.  
  113.           set_dollar1_parm(@err_string);
  114.           send_message(err_num);
  115.  
  116.           error_sw     := TRUE;
  117.           ok_to_change := FALSE;
  118.  
  119.         END;
  120.  
  121.     END;
  122.  
  123.   (*=========================================================================*)
  124.   (* Change command main line                                                *)
  125.   (*=========================================================================*)
  126.  
  127.   BEGIN;
  128.  
  129.     log_data_s('L' + cmd_string);
  130.  
  131.     word_count := WORDS(cmd_string);
  132.  
  133.     change_char := UPCASE(cmd_string[2]);
  134.  
  135.     (*-----------------------------------------------------------------------*)
  136.     (* Handle change                                                         *)
  137.     (*-----------------------------------------------------------------------*)
  138.  
  139.     CASE change_char OF
  140.  
  141.       (*---------------------------------------------------------------------*)
  142.       (* Change ' '                                                          *)
  143.       (*---------------------------------------------------------------------*)
  144.  
  145.       ' ': BEGIN;
  146.  
  147.              (*--------------------------------------------------------------*)
  148.              (* Check count                                                  *)
  149.              (*--------------------------------------------------------------*)
  150.  
  151.              IF word_count < 2 THEN
  152.                BEGIN;
  153.                  send_message(message_not_en);
  154.                  active_tcb^.error_sw :=TRUE;
  155.                  EXIT;
  156.                END;
  157.  
  158.              (*--------------------------------------------------------------*)
  159.              (* Validate number                                              *)
  160.              (*--------------------------------------------------------------*)
  161.  
  162.              upcase_str_var(cmd_string);
  163.  
  164.              check_multiple_msg(@cmd_string, 2, word_count);
  165.              IF active_tcb^.error_sw THEN
  166.                EXIT;
  167.  
  168.              (*--------------------------------------------------------------*)
  169.              (* Loop thru all the messages                                   *)
  170.              (*--------------------------------------------------------------*)
  171.  
  172.              c_msg_no := get_next_multiple_msg;
  173.  
  174.              WHILE c_msg_no <> 0 DO
  175.                BEGIN;
  176.  
  177.                  (*----------------------------------------------------------*)
  178.                  (* Ready to change                                          *)
  179.                  (*----------------------------------------------------------*)
  180.  
  181.                  ok_to_change := TRUE;
  182.  
  183.                  (*----------------------------------------------------------*)
  184.                  (* Find message,  Give error if cannot be found             *)
  185.                  (*----------------------------------------------------------*)
  186.  
  187.                  i_ptr := find_msg(c_msg_no);
  188.  
  189.                  IF i_ptr = NIL THEN
  190.                    BEGIN;
  191.                      put_change_error(message_rmc_nf);
  192.                      IF NOT in_multiple_msg_range THEN
  193.                        EXIT;
  194.                    END;
  195.  
  196.                  (*----------------------------------------------------------*)
  197.                  (* If so far so good then change it                         *)
  198.                  (*----------------------------------------------------------*)
  199.  
  200.                  IF ok_to_change THEN
  201.                    change_a_msg(i_ptr, and_mask, or_mask, TRUE);
  202.  
  203.                  (*----------------------------------------------------------*)
  204.                  (* Get next message to change                               *)
  205.                  (*----------------------------------------------------------*)
  206.  
  207.                  c_msg_no := get_next_multiple_msg;
  208.  
  209.                END; (*----- End loop thru all messages ----------------------*)
  210.  
  211.            END;
  212.  
  213.       (*---------------------------------------------------------------------*)
  214.       (* All other letters                                                   *)
  215.       (*---------------------------------------------------------------------*)
  216.  
  217.       ELSE
  218.         BEGIN;
  219.  
  220.           (*-----------------------------------------------------------------*)
  221.           (* Build search block                                              *)
  222.           (*-----------------------------------------------------------------*)
  223.  
  224.           cmd_string := COPY(cmd_string, 2, 255);
  225.           set_search(cmd_string, @search_block);
  226.  
  227.           IF active_tcb^.error_sw THEN
  228.             EXIT;
  229.  
  230.           (*-----------------------------------------------------------------*)
  231.           (* Find first one                                                  *)
  232.           (*-----------------------------------------------------------------*)
  233.  
  234.           search_msg(@search_block);
  235.  
  236.           IF search_block.search_last = NIL THEN
  237.             BEGIN;
  238.               send_message(message_lmc_nf);
  239.               active_tcb^.error_sw := TRUE;
  240.               EXIT;
  241.             END;
  242.  
  243.           (*-----------------------------------------------------------------*)
  244.           (* Loop changing things                                            *)
  245.           (*-----------------------------------------------------------------*)
  246.  
  247.           REPEAT
  248.             IF active_tcb^.error_sw THEN
  249.               EXIT;
  250.             change_a_msg(search_block.search_last, and_mask, or_mask, TRUE);
  251.             search_msg(@search_block);
  252.           UNTIL search_block.search_last = NIL;
  253.  
  254.         END;
  255.  
  256.     END;
  257.  
  258.   END;
  259.  
  260. (*===========================================================================*)
  261. (* Change status of a message                                                *)
  262. (*===========================================================================*)
  263.  
  264. PROCEDURE change_status_cmd(cmd_string : STRING);
  265.  
  266.   VAR
  267.     i : msg_flag_type;
  268.     j : BYTE;
  269.     s : STRING[10];
  270.  
  271.   BEGIN;
  272.  
  273.     s := subword(@cmd_string, 1, 1);
  274.     upcase_str_var(s);
  275.  
  276.     j := find(@change_status_list, @s);
  277.  
  278.     cmd_string := subword(@cmd_string, 2, 0);
  279.  
  280.     IF cmd_string = '' THEN
  281.       BEGIN;
  282.         send_message(message_not_en);
  283.         active_tcb^.error_sw :=TRUE;
  284.         EXIT;
  285.       END;
  286.  
  287.     IF (cmd_string[1] >= '0') AND (cmd_string[1] <= '9') THEN
  288.       cmd_string := '? ' + cmd_string
  289.     ELSE
  290.       cmd_string := '?' + cmd_string;
  291.  
  292.     CASE j OF
  293.  
  294.       (*---------------------------------------------------------------------*)
  295.       (* HOLD                                                                *)
  296.       (*---------------------------------------------------------------------*)
  297.  
  298.       1: change_msg_group(cmd_string, 0, mf_hold);
  299.  
  300.       (*---------------------------------------------------------------------*)
  301.       (* REL                                                                 *)
  302.       (*---------------------------------------------------------------------*)
  303.  
  304.       2: BEGIN;
  305.            i := mf_hold + mf_review;
  306.            change_msg_group(cmd_string, NOT i, 0);
  307.          END;
  308.  
  309.       (*---------------------------------------------------------------------*)
  310.       (* UNKILL                                                              *)
  311.       (*---------------------------------------------------------------------*)
  312.  
  313.       3: BEGIN;
  314.            i := mf_kill;
  315.            change_msg_group(cmd_string, NOT i, 0);
  316.          END;
  317.  
  318.       ELSE
  319.         BEGIN;
  320.           WRITELN ('Bad index in CMF -- ', j);
  321.           HALT;
  322.         END;
  323.  
  324.     END;
  325.  
  326.   END;
  327.  
  328. END.
  329.  
  330.